package com.runjian.rundo.iot.agent.common.session;

import java.util.concurrent.Future;
import java.util.function.Consumer;

import io.netty.buffer.ByteBuf;

/**
 * 设备会话
 *
 * @author LiGang
 */
public interface Session {

    /**
     * 写入数据并刷新
     *
     * @param byteBuf byteBuf
     * @param callback 写入数据的回调函数,true:成功,false:失败
     * @return Future对象,可通过此对象来检验是否已执行
     */
    default Future<Void> writeAndFlush(ByteBuf byteBuf, Consumer<Boolean>... callback) {
        return null;
    }

    /**
     * 写入数据并刷新
     *
     * @param data byte[]
     * @param callback 写入数据的回调函数,true:成功,false:失败
     * @return Future对象,可通过此对象来检验是否已执行
     */
    default Future<Void> writeAndFlush(byte[] data, Consumer<Boolean>... callback) {
        return null;
    }

    /**
     * 写入数据并刷新
     *
     * @param data String
     * @param callback 写入数据的回调函数,true:成功,false:失败
     * @return Future对象,可通过此对象来检验是否已执行
     */
    default Future<Void> writeAndFlush(String data, Consumer<Boolean>... callback) {
        return null;
    }

    /**
     * 关闭连接
     * 
     * @param callbacks 回调函数
     * @return Future对象,可通过此对象来检验是否已执行
     */
    default Future<Void> close(Consumer<Boolean>... callbacks) {
        return null;
    }

    /**
     * 设备连接是否活跃
     *
     * @return 连接是否活跃
     */
    Boolean isActive();

    /**
     * 设置通道传递id
     *
     * @param externalId 设备id
     */
    default void setWriteExternalId(String externalId) {

    }

    /**
     * 获取通道传递id
     *
     * @return 通道传递id
     */
    default String getWriteExternalId() {
        return "";
    }

    /**
     * 获取通道下发数据
     *
     * @return 通道下发数据
     */
    default byte[] getCommand() {
        return null;
    }

    /**
     * 获取通道下发设备id
     *
     * @return 通道下发设备id
     */
    default String getDeviceExternalId() {
        return "";
    }

    /**
     * 设置通道下发设备id
     *
     * @param subDeviceId 设备id
     */
    default void setSubDeviceId(String subDeviceId) {}

}
